<?php
/**
 * 汇友科技
 * @copyright (c) 2017 http://www.huiyou365.net All rights reserved.
 * @author: Creatint <creatint@163.com>
 */

namespace Home\Model;

use Common\Model\Model;
use Think\Exception;

class UserModel extends Model{


    /* 用户模型自动验证 */
    protected $_validate = array(
        /* 验证用户名 */
        array('username', '1,250', -1, self::EXISTS_VALIDATE, 'length'), //用户名长度不合法
        array('username', 'checkDenyMember', -2, self::EXISTS_VALIDATE, 'callback'), //用户名禁止注册
//        array('username', '', -3, self::EXISTS_VALIDATE, 'unique'), //用户名被占用

        /* 验证密码 */
        array('password', '3,30', -4, self::EXISTS_VALIDATE, 'length'), //密码长度不合法

        /* 验证邮箱 */
        array('email', 'email', -5, self::EXISTS_VALIDATE), //邮箱格式不正确
        array('email', '1,32', -6, self::EXISTS_VALIDATE, 'length'), //邮箱长度不合法
        array('email', 'checkDenyEmail', -7, self::EXISTS_VALIDATE, 'callback'), //邮箱禁止注册
        array('email', '', -8, self::EXISTS_VALIDATE, 'unique'), //邮箱被占用

        /* 验证手机号码 */
        array('mobile', '//', -9, self::EXISTS_VALIDATE), //手机格式不正确 TODO:
        array('mobile', 'checkDenyMobile', -10, self::EXISTS_VALIDATE, 'callback'), //手机禁止注册
        array('mobile', '', -11, self::EXISTS_VALIDATE, 'unique'), //手机号被占用
    );

    /* 用户模型自动完成 */
    protected $_auto = array(
        array('password', 'yo_md5', self::MODEL_BOTH, 'function', YO_AUTH_KEY),
        array('reg_time', NOW_TIME, self::MODEL_INSERT),
        array('reg_ip', 'get_client_ip', self::MODEL_INSERT, 'function', 1),
        array('update_time', NOW_TIME),
        array('status', 'getStatus', self::MODEL_BOTH, 'callback'),
    );

    /**
     * 注册一个新用户
     * @param  string $username 用户名
     * @param  string $password 用户密码
     * @param  string $email    用户邮箱
     * @param  string $mobile   用户手机号码
     * @return integer          注册成功-用户信息，注册失败-错误编号
     */
    public function register($data){

        //验证手机
        if(empty($data['mobile'])) unset($data['mobile']);

        /* 添加用户 */
        if($this->create($data)){
            $uid = $this->add();
            return $uid ? $uid : 0; //0-未知错误，大于0-注册成功
        } else {
            return $this->getError(); //错误详情见自动验证注释
        }
    }

    /**
     * 用户登录认证
     * @param  string  $username 用户账号,默认为username，可能是email，mobile,id
     * @param  string  $password 用户密码
     * @param  integer $type     用户名类型 （1-用户名，2-邮箱，3-手机，4-UID）
     * @return integer           登录成功-用户ID，登录失败-错误编号
     */
    public function login($username, $password, $type = 1){
        $map = array();
        switch ($type) {
            case 1:
                $map['username'] = $username;
                break;
            case 2:
                $map['email'] = $username;
                break;
            case 3:
                $map['mobile'] = $username;
                break;
            case 4:
                $map['uid'] = $username;
                break;
            default:
                return 0; //参数错误
        }

        /* 获取用户数据 */
        $user = $this->where($map)->find();
        if(is_array($user) && $user['status']){

            /* 验证用户密码 */
            if(yo_md5($password, YO_AUTH_KEY) === $user['password']){

                // 持久化用户认证
                $this->autoLogin($user);

                //更新用户登录信息
                $this->updateLogin($user['uid']);

                return $user['uid']; //登录成功，返回用户ID
            } else {
                return -2; //密码错误
            }
        } else {
            return -1; //用户不存在或被禁用
        }
    }

    public function autoLogin($user){
        /* 更新登录信息 */
        $data = array(
            'uid'             => $user['uid'],
            'last_login_time' => NOW_TIME,
            'last_login_ip'   => get_client_ip(1),
            'login_times'           => array('exp', '`login_times`+1'),
        );
        $this->save($data);

        /* 记录登录SESSION和COOKIES */
        $auth = array(
            'uid'             => $user['uid'],
            'openid'          => $user['openid'],
            'chenghu'         =>  $user['chenghu'],
            'username'        => $user['username'],
            'status'          => $user['status'],
            'headimgurl'          => $user['headimgurl'],
            'last_login_time' => $user['last_login_time'],
            'subscribe' => $user['subscribe'],
        );

        session('user', $auth);
        session('user_auth_sign', data_auth_sign($auth));

    }

    public function loginByWechat($wechat_user){
        trace('微信登录方法','login');
        if ( !$wechat_user['openid'] ) {
            trace('无openid','login');
            return false;
        }
        trace('有openid','login');

        // 有openid则登录
        if ( $user = $this->info(['openid'=>$wechat_user['openid']]) ) {
            trace('存在用户，自动登录','login:UserModel');
            $this->autoLogin($user);
            return $user['uid'];
        }else {
            // 无openid则添加用户
            trace('增加用户记录','login');
            $user = [
                'openid'    =>  $wechat_user['openid'],
//                'username'  =>  isset($wechat_user['nickname'])?$wechat_user['nickname']:substr($wechat_user['openid'],0,16),
                'username'  =>   $wechat_user['openid'],
                'reg_ip'    =>  get_client_ip(1),
                'status'    =>  1,
                'headimgurl'=> isset($wechat_user['headimgurl'])?$wechat_user['headimgurl']:'',
                'province'=> isset($wechat_user['province'])?$wechat_user['province']:'',
                'city'=> isset($wechat_user['city'])?$wechat_user['city']:'',
                'subscribe'=> isset($wechat_user['subscribe'])?$wechat_user['subscribe']:0,
            ];
            trace($user,'login');
            // 新增用户
            if($this->add($user)){
                trace('新增用户记录成功','login');
                // 计数器+1
                if ( $this->counter() >=2 ) {
                    trace('计数器超额','login');
                    return false;
                } else {
                    // 重新尝试登陆
                    return $this->loginByWechat($wechat_user);
                }
            } else {
                return false;
            }
        }
    }

    /**
     * 注销当前用户
     * @return bool
     */
    public function logout(){
        // 清空session

        try{
            session('user', null);


            session('user_auth_sign', null);
            session(null);
        }catch (  Exception $e ) {
            return false;
        }
        return true;
    }

    /**
     * 更新用户登录信息
     * @param  integer $uid 用户ID
     */
    protected function updateLogin($uid){
        $data = array(
            'uid'              => $uid,
            'last_login_time' => NOW_TIME,
            'last_login_ip'   => get_client_ip(1),
        );
        $this->save($data);
    }


    /**
     * 检测用户名是不是被禁止注册
     * @param  string $username 用户名
     * @return boolean          ture - 未禁用，false - 禁止注册
     */
    protected function checkDenyMember($username){
        return true; //TODO: 暂不限制，下一个版本完善
    }

    /**
     * 检测邮箱是不是被禁止注册
     * @param  string $email 邮箱
     * @return boolean       ture - 未禁用，false - 禁止注册
     */
    protected function checkDenyEmail($email){
        return true; //TODO: 暂不限制，下一个版本完善
    }

    /**
     * 检测手机是不是被禁止注册
     * @param  string $mobile 手机
     * @return boolean        ture - 未禁用，false - 禁止注册
     */
    protected function checkDenyMobile($mobile){
        return true; //TODO: 暂不限制，下一个版本完善
    }

    /**
     * 根据配置指定用户状态
     * @return integer 用户状态
     */
    protected function getStatus(){
        return true; //TODO: 暂不限制，下一个版本完善
    }
}